require "src.class"
require "src.GameRole"
require "src.NameGenerator"

-- Mgr类使用单例模式
GameRoleMgr = class("GameRoleMgr")

-- roles存放角色，maxId维护自增id
function GameRoleMgr:new()
    local instance = GameRoleMgr.instance or {roles = {}, maxId = 0}
    GameRoleMgr.instance = instance
    setmetatable(instance, GameRoleMgr)
    GameRoleMgr.__index = GameRoleMgr
    return instance
end

function GameRoleMgr:Instance()
    if self.instance == nil then self.instance = self:new() end
    return self.instance
end

-- 接口实现

-- add_role(role),添加一个角色,返回bool表示是否成功
function GameRoleMgr:add_role(role)
    if type(role) ~= "table" then
        print("add_role:不是table")
    elseif role.InstanceOf == nil then
        print("add_role:不是对象")
    elseif not role.InstanceOf(GameRole) then
        print("add_role:不是GameRole")
    else
        -- 检查id是否重复
        if self.instance.roles[role.id] ~= nil then
            print("add_role:角色id重复")
            return false
        else
            -- 未重复则添加
            self.instance.roles[role.id] = role
            -- 维护maxId
            if self.instance.maxId < role.id then
                self.instance.maxId = role.id
            end
        end
        return true
    end
    return false
end

-- del_rol_by_id(id),删除角色,成功返回删除的角色，失败返回原因
function GameRoleMgr:del_rol_by_id(id)
    local errMsg = ''
    local role
    if type(id) == 'number' then
        if self.instance.roles[id] ~= nil then
            -- 正常删除
            role = self.instance.roles[id]
            self.instance.roles[id] = nil
        else
            errMsg = "del_rol_by_id:不存在该id的角色"
        end
    else
        errMsg = "del_rol_by_id:角色id需要是数字"
    end
    if errMsg ~= '' then
        print(errMsg)
        return errMsg
    end
    return role
end

-- get_rol_by_id(id),根据id获取角色,成功返回role,找不到返回原因
function GameRoleMgr:get_rol_by_id(id)
    local errMsg = ''
    if type(id) == 'number' then
        if self.instance.roles[id] ~= nil then
            -- 正常删除
            return self.instance.roles[id]
        else
            errMsg = "get_rol_by_id:不存在该id的角色"
        end
    else
        errMsg = "get_rol_by_id:角色id需要是数字"
    end
    if errMsg ~= '' then
        print(errMsg)
        return errMsg
    end
    return true
end

-- generate_id(),返回一个未被占用的role id
function GameRoleMgr:generate_id()
    self.instance.maxId = self.instance.maxId + 1
    return self.instance.maxId
end

-- generate_role(),id自增地生成1个角色
function GameRoleMgr:generate_role()
    local id = GameRoleMgr:generate_id()
    local role = GameRole.new(id, NameGenerator:randomName(), 10001,
                              math.random(50, 500), math.random(20, 200))
    self.instance.roles[id] = role
end

-- generate_role_list(n),生成n个角色
function GameRoleMgr:generate_role_list(n)
    local errMsg = ''
    if type(n) == 'number' then
        -- 生成!
        for i = 1, n do GameRoleMgr:generate_role() end
    else
        errMsg = "generate_role_list:参数n需要是数字"
    end
end

-- __tostring,打印10个角色
function GameRoleMgr:__tostring()
    local str = ''
    for i, v in ipairs(self.instance.roles) do
        if i > 10 then break end
        str = str .. v:__tostring() .. "\n"
    end
    return str
end

-- get_att_sort_list(n),根据攻击力排序输出角色,输出排名前n角色
function GameRoleMgr:get_att_sort_list(n)
    local errMsg = ''
    if tonumber(n) == nil then
        errMsg = 'get_att_sort_list:参数必须是数字'
    elseif n <= 0 then
        errMsg = 'get_att_sort_list:请求的数量需要>0'
    else
        table.sort(self.instance.roles, function(a, b)
            if a == nil then
                return false
            elseif b == nil then
                return true
            end
            return a.atk > b.atk
        end)
        local res = {}
        for i, v in ipairs(self.instance.roles) do
            if i > n then break end
            res[i] = v
        end
        return res
    end
    return errMsg
end
